package DataStructureAndAlgorithm.CSP.Day07;

import java.util.Scanner;

public class AcWing_3223 {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[][] nums = new int[n + 1][m + 1];
        int[][] res = new int[n + 1][m + 1];
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= m; j++){
                nums[i][j] = in.nextInt();
                res[i][j] = nums[i][j];
            }
        }
        int last;
        int cnt = 0;
        //计算横着的情况
        for (int i = 1; i <= n; i++){
            cnt = 0;
            last = nums[i][1];
            for (int j = 1; j <= m; j++){

                if (last == nums[i][j]){
                    cnt++;
                }else {
                    last = nums[i][j];
                    if (cnt >= 3){
                        while (cnt > 0){
                            //下标的计算，随便找一种情况代入即可知道
                            res[i][j - cnt] = 0;
                            cnt--;
                        }
                        cnt = 0;
                    }else {
                        cnt = 1;
                    }
                    cnt = 1;
                }
            }
            //特判以连续相同数字结束的行
            if (cnt >= 3){
                while (cnt > 0){
                    //下标的计算，随便找一种情况代入即可知道
                    res[i][m - cnt + 1] = 0;
                    cnt--;
                }
                cnt = 0;
            }else {
                cnt = 1;
            }
        }

        //计算竖着的情况
        for (int j = 1; j <= m; j++){
            last = nums[1][j];
            cnt = 0;
            for (int i = 1; i <= n; i++){
                if (last == nums[i][j]){
                    cnt++;
                }else {
                    last = nums[i][j];
                    if (cnt >= 3){
                        while (cnt > 0){
                            //下标的计算，随便找一种情况代入即可知道
                            res[i - cnt][j] = 0;
                            cnt--;
                        }
                    }else {
                        cnt = 1;
                    }
                    cnt = 1;
                }
            }
            //特判以连续相同数字结束的列
            if (cnt >= 3){
                while (cnt > 0){
                    //下标的计算，随便找一种情况代入即可知道
                    res[n - cnt + 1][j] = 0;
                    cnt--;
                }
            }else {
                cnt = 0;
            }
        }
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= m; j++){
                System.out.print(res[i][j] + " ");
            }
            System.out.println();
        }
    }
}
/*
消除类游戏是深受大众欢迎的一种游戏，游戏在一个包含有 n 行 m

列的游戏棋盘上进行，棋盘的每一行每一列的方格上放着一个有颜色的棋子，当一行或一列上有连续三个或更多的相同颜色的棋子时，这些棋子都被消除。

当有多处可以被消除时，这些地方的棋子将同时被消除。

现在给你一个 n
行 m

列的棋盘，棋盘中的每一个方格上有一个棋子，请给出经过一次消除后的棋盘。

请注意：一个棋子可能在某一行和某一列同时被消除。
输入格式

输入的第一行包含两个整数 n,m

，用空格分隔，分别表示棋盘的行数和列数。

接下来 n
行，每行 m

个整数，用空格分隔，分别表示每一个方格中的棋子的颜色。

颜色使用 1
至 9

编号。
输出格式

输出 n
行，每行 m

个整数，相邻的整数之间使用一个空格分隔，表示经过一次消除后的棋盘。

如果一个方格中的棋子被消除，则对应的方格输出 0

，否则输出棋子的颜色编号。
数据范围

所有的评测用例满足：1≤n,m≤30

。
输入样例1：

4 5
2 2 3 1 2
3 4 5 1 4
2 3 2 1 3
2 2 2 4 4

输出样例1：

2 2 3 0 2
3 4 5 0 4
2 3 2 0 3
0 0 0 4 4

样例1解释

棋盘中第 4
列的 1 和第 4 行的 2

可以被消除，其他的方格中的棋子均保留。
输入样例2：

4 5
2 2 3 1 2
3 1 1 1 1
2 3 2 1 3
2 2 3 3 3

输出样例2：

2 2 3 0 2
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0

样例2解释

棋盘中所有的 1
以及最后一行的 3 可以被同时消除，其他的方格中的棋子均保留。
 */